package telas.comum;

import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import telas.componentes.Botao;
import telas.componentes.CampoNumeroInteiro;
import telas.componentes.CampoTexto;
import telas.componentes.Painel;
import telas.componentes.Rotulo;
import business.sistema.ExceptionSistema;
import java.lang.reflect.*;

public class TelaDialogoSimples extends TelaDialogo
{
	private static final long serialVersionUID = 1L;
	private Painel pnlJContentPane = null;
	private Rotulo rtlCodigo = null;
	private CampoNumeroInteiro cniCodigo = null;
	private Rotulo rtlNome = null;
	private CampoTexto ctNome = null;
	private Botao btnSalvar = null;
	private Botao btnFechar = null;
	private Object objDados = null;
	private boolean novo = true;

	/**
	 * @param owner
	 */
	public TelaDialogoSimples(String dscTituloDialogo, boolean novo, Object objetoDados) 
	{
		super();
		this.novo = novo;
		this.objDados = objetoDados;
		initialize(dscTituloDialogo);
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	public void initialize(String dscTituloDialogo) 
	{
		this.setSize(426, 200);
		this.setContentPane(getPnlJContentPane());
		this.setModal(true);
		this.setLocation(300,300);
		this.setTitle(dscTituloDialogo);
		
		if(!novo)
		{
			fillForm();
		}
		setVisible(true);
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	public Painel getPnlJContentPane() 
	{
		if (pnlJContentPane == null) 
		{
			pnlJContentPane = new Painel();
			pnlJContentPane.setLayout(null);
			pnlJContentPane.add(getRtlCodigo(), null);
			pnlJContentPane.add(getCniCodigo(), null);
			pnlJContentPane.add(getRtlNome(), null);
			pnlJContentPane.add(getCtNome(), null);
			pnlJContentPane.add(getBtnSalvar(), null);
			pnlJContentPane.add(getBtnFechar(), null);
		}
		
		return pnlJContentPane;
	}

	/**
	 * This method initializes txtCodigo	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	public CampoNumeroInteiro getCniCodigo() 
	{
		if (cniCodigo == null) 
		{
			cniCodigo = new CampoNumeroInteiro();
			cniCodigo.setBounds(new Rectangle(69, 12, 66, 20));
			cniCodigo.setEditable(false);
		}
		
		return cniCodigo;
	}

	/**
	 * This method initializes txtNome	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	public CampoTexto getCtNome() 
	{
		if (ctNome == null) 
		{
			ctNome = new CampoTexto();
			ctNome.setBounds(new Rectangle(69, 38, 344, 20));
		}
		
		return ctNome;
	}

	/**
	 * This method initializes btnSalvar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	public Botao getBtnSalvar() 
	{
		if (btnSalvar == null) 
		{
			btnSalvar = new Botao();
			btnSalvar.setBounds(new Rectangle(253, 142, 76, 23));
			btnSalvar.setText("Salvar");
			btnSalvar.addActionListener
			(
				new ActionListener()
				{
					public void actionPerformed(ActionEvent e)
					{
						try
						{
							salvar();
						}
						catch(Exception ex)
						{
							new ExceptionSistema(ex);
						}
					}
				}
			);
		}
		
		return btnSalvar;
	}

	/**
	 * This method initializes btnFechar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	public Botao getBtnFechar() 
	{
		if (btnFechar == null) 
		{
			btnFechar = new Botao();
			btnFechar.setBounds(new Rectangle(331, 142, 76, 23));
			btnFechar.setText("Fechar");
			
			/* Evento para fechar o di�logo */
			btnFechar.addActionListener
			(
				new ActionListener()
				{
					public void actionPerformed(ActionEvent e)
					{
						dispose();
					}
				}
			);
		}
		
		return btnFechar;
	}
	
	public Object getObjDados() 
	{
		return objDados;
	}

	public void setObjDados(Object objDados) 
	{
		this.objDados = objDados;
	}
	
	
	public void fillForm()
	{
		Method objMetodo = null;
		try
		{
			Object objDados = getObjDados();
			Class<?> objClasse = objDados.getClass();
			
			/* Código */
			objMetodo = objClasse.getMethod("getCodigo");			
			cniCodigo.setText(String.valueOf(objMetodo.invoke(objDados)));
			
			/* Nome */
			objMetodo = objClasse.getMethod("getNome");
			ctNome.setText((String)objMetodo.invoke(objDados));
		}
		catch(NoSuchMethodException nsme)
		{
			System.out.println("Método não encontrado.");
			nsme.printStackTrace();
		}
		catch(InvocationTargetException ite)
		{
			ite.printStackTrace();
		}
		catch(IllegalAccessException iae)
		{
			iae.printStackTrace();
		}
	}
	
	public void preencheObjeto()
	{
		Method objMetodo = null;
		try
		{
			Object objDados = getObjDados();
			Class<?> objClasse = objDados.getClass();
			
			/* Código */
			objMetodo = objClasse.getMethod("setCodigo", int.class);
			if(!cniCodigo.getText().equals(""))
				objMetodo.invoke(objDados, Integer.parseInt(cniCodigo.getText()));
			
			/* Nome */
			objMetodo = objClasse.getMethod("setNome", String.class);
			objMetodo.invoke(objDados, ctNome.getText());
		}
		catch(NoSuchMethodException nsme)
		{
			System.out.println("Método não encontrado.");
			nsme.printStackTrace();
		}
		catch(InvocationTargetException ite)
		{
			ite.printStackTrace();
		}
		catch(IllegalAccessException iae)
		{
			iae.printStackTrace();
		}
	}
	
	public void limparCampos()
	{
		getCniCodigo().setText("");
		getCtNome().setText("");
	}

	public void salvar() throws Exception
	{
		Method objMetodo = null;
		
		try
		{
			preencheObjeto();
			Object objDados = getObjDados();
			Class<?> objClasse = objDados.getClass();
			
			/* Salvar */
			objMetodo = objClasse.getMethod("salvar");
			objMetodo.invoke(objDados);
		}
		catch(NoSuchMethodException nsme)
		{
			throw nsme;
		}
		catch(InvocationTargetException ite)
		{
			throw ite;
		}
		catch(IllegalAccessException iae)
		{
			throw iae;
		}
		
		if(novo)
		{
			limparCampos();
		}
		else
		{
			this.dispose();
		}
	}

	public Rotulo getRtlNome() 
	{
		if(rtlNome == null)
		{
			rtlNome = new Rotulo();
			rtlNome.setBounds(new Rectangle(16, 40, 47, 16));
			rtlNome.setText("Nome :");
		}
		
		return rtlNome;
	}

	public Rotulo getRtlCodigo() 
	{
		if(rtlCodigo == null)
		{
			rtlCodigo = new Rotulo();
			rtlCodigo.setBounds(new Rectangle(16, 14, 47, 16));
			rtlCodigo.setText("Código :");
		}
		
		return rtlCodigo;
	}
}
